package com.waitingresult.thread;

/**
 * All right reserved,Designed By WangShuai
 *
 * @author : WangShuai
 * @version : V1.0
 * @ClassName : VolatileDemo
 * @Description :   在当前这段代码中， 如果不是用 volatile 关键字， 启动的子线程 永远都不会停止，
 *                  是因为 子线程会copy 一个flag 到线程本地的缓存， 主线程在修改这个flag的时候， 子线程 并不知道 flag 已经被修改了 也就是说子线程认为falg还是true
 *                  是用Volate关键字， 就是让子线程 不去进行缓存， 并且主线程修改完成之后还是要把flag的值 给写回去（写回内存中）
 * @date : 2022/9/18 15:30
 */
public class VolatileDemo {
    volatile static boolean flag = true;
    private static VolatileDemo INSTANCE = null;
    private VolatileDemo(){}
    public static VolatileDemo getInstance(){
        if(INSTANCE == null){
            synchronized (VolatileDemo.class){
                if(INSTANCE == null){
                    INSTANCE = new VolatileDemo();
                }
            }
        }
        return INSTANCE;
    }

    public static void main(String[] args) throws InterruptedException {

       new Thread(()->{
            System.err.println("thread Start");
            while (flag){

            }
            System.err.println("thread end");
        }).start();

        Thread.sleep(1000);

        flag = false;
        System.err.println("main update flag true");
    }
}
